home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / MacHacksBug.py next >
Encoding:
Python Source  |  2000-06-23  |  10.1 KB  |  433 lines

  1. #!/usr/bin/python
  2.  
  3. from Tkinter import *
  4. import string 
  5. import sys
  6. import telnetlib
  7. import string
  8. import re
  9.  
  10. HOST = "64.81.5.201"
  11. USER = "foo"
  12. PASS = "bar"
  13.  
  14.  
  15.  
  16.  
  17. CurentBoss = ""
  18. reg_names = ["",
  19.             "R0  ",
  20.             "SP  ",
  21.             "TOC ",
  22.             "R3  ",
  23.             "R4  ",
  24.             "R5  ",
  25.             "R6  ",
  26.             "R7  ",
  27.             "R8  ",
  28.             "R9  ",
  29.             "R10 ",
  30.             "R11 ",
  31.             "R12 ",
  32.             "R13 ",
  33.             "R14 ",
  34.             "R15 ",
  35.             "R16 ",
  36.             "R17 ",
  37.             "R18 ",
  38.             "R19 ",
  39.             "R20 ",
  40.             "R21 ",
  41.             "R22 ",
  42.             "R23 ",
  43.             "R24 ",
  44.             "R25 ",
  45.             "R26 ",
  46.             "R27 ",
  47.             "R28 ",
  48.             "R29 ",
  49.             "R30 ",
  50.             "R31 ",
  51.             "PC  ",
  52.             "ps",
  53.             "CR  ",
  54.             "LR  ",
  55.             "CTR ",
  56.             "xer "]
  57.  
  58.  
  59. # This is a two machine debugger
  60.  
  61. class App(Frame):
  62.     match = re.compile("\033\\[([0-9]*)C")
  63.     match_reg = re.compile("0x([0-9,a-f]*)")
  64.     def __init__(self, master):
  65.         Frame.__init__(self, master)
  66.  
  67.         self.master = master
  68.         self.pc = ""
  69.         self.LIST_CMD = "disas $pc $pc+20\n"
  70.         
  71.         self.input_data = ""
  72.         self.incommand = 0    
  73.         self.registers = Text(width=12,height=37,borderwidth=1,
  74.                               takefocus="off",relief = RIDGE)
  75.         self.registers.grid(row=0,column=0,rowspan=3)
  76.         self.registers.insert(END,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
  77.  
  78.         self.history = Text(width=80,height=30,borderwidth=1,relief = RIDGE)
  79.         self.history.grid(row=0,column=1)
  80.         self.history.insert(END,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nMacHacksBug 1.0\n\n")
  81.         self.length = 43
  82.         
  83.         self.dis = Text(width=80,height=5,borderwidth=1,relief = RIDGE)
  84.         self.dis.grid(row=1,column=1)
  85.         self.dis.insert(END,"dis")
  86.  
  87.         self.commands = Entry(width=80)
  88.         self.commands.grid(row=2,column=1)
  89.  
  90.         # and here we get a callback when the user hits return. we could
  91.         # make the key that triggers the callback anything we wanted to.
  92.         # other typical options might be <Key-Tab> or <Key> (for anything)
  93.         self.commands.bind('<Key-Return>', self.issue_command)
  94.         self.connected = 0
  95.  
  96.  
  97. ######################################################################
  98.  
  99.     def connect(self):
  100.  
  101.         PROMPT = "$"
  102.         self.tn = telnetlib.Telnet()
  103. #        self.tn.set_debuglevel(4)
  104.         self.tn.open(HOST)        
  105.         self.tn.read_until("login: ")
  106.         self.tn.write(USER + "\n")
  107.         self.tn.read_until("Password")
  108.         self.tn.write(PASS + "\n")
  109.         self.tn.read_until(PROMPT)
  110.         # Linux
  111.         self.tn.write("export TERM=vt100\n")
  112.         self.tn.read_until(PROMPT)
  113.         self.tn.write("screen -x\n")
  114.         
  115.         (match, junk, result) = self.tn.expect([r"\(gdb\)",(r"\$ ")])
  116.         
  117.         if ( -1 != string.find(result,"no screen to be attached")):
  118.             # start a new screen sessions
  119.             self.tn.write("screen\n")
  120.             result = self.tn.read_until(PROMPT)
  121.             
  122.         if ( match == 1 ):
  123.             self.tn.write("gdb\n")
  124.             result = self.tn.read_until("(gdb)")
  125.  
  126.  
  127.         self.tn.write("set height 0\n")
  128.         result = self.tn.read_until("(gdb) ")
  129.  
  130.         self.connected = 1
  131.         
  132.         while 1:
  133.             (match, junk, result) = self.tn.expect([r"\(gdb\)"],1)
  134.             if match == -1:
  135.                 break
  136.         
  137.         self.tn.write("set confirm no\n")
  138.         
  139.         self.poll()
  140.  
  141. ######################################################################
  142.  
  143.     def connect_X(self):
  144.         PROMPT = "%"
  145.         self.tn = telnetlib.Telnet()
  146. #        self.tn.set_debuglevel(4)
  147.         self.tn.open(HOST)        
  148.         self.tn.read_until("login: ")
  149.         self.tn.write(USER + "\n")
  150.         self.tn.read_until("Password")
  151.         self.tn.write(PASS + "\n")
  152.         self.tn.read_until(PROMPT)
  153.         # OS X
  154.         self.tn.write("setenv TERM vt100\n")
  155.         self.tn.read_until(PROMPT)
  156.         self.tn.write("screen -x\n")
  157.         
  158.         (match, junk, result) = self.tn.expect([r"\(gdb\)",(r"\% ")])
  159.         
  160.         if ( -1 != string.find(result,"no screen to be attached")):
  161.             # start a new screen sessions
  162.             self.tn.write("screen\n")
  163.             result = self.tn.read_until(PROMPT)
  164.             
  165.         if ( match == 1 ):
  166.             self.tn.write("gdb\n")
  167.             result = self.tn.read_until("(gdb)")
  168.  
  169.  
  170.         self.tn.write("set height 0\n")
  171.         result = self.tn.read_until("(gdb) ")
  172.  
  173.         self.connected = 1
  174.         
  175.         while 1:
  176.             (match, junk, result) = self.tn.expect([r"\(gdb\)"],1)
  177.             if match == -1:
  178.                 break
  179.         
  180.         self.tn.write("i reg\n" +
  181.                       "list *$pc\n")
  182.         self.poll()
  183.  
  184. ######################################################################
  185.         
  186.     def poll(self):
  187.         
  188.         temp = self.tn.read_eager()
  189.         
  190.  
  191.         if temp != '':
  192.             self.input_data = self.input_data + temp
  193.  
  194.             result = string.find(self.input_data,"(gdb) ")
  195.             if (result != -1):
  196.                 self.process_command(self.input_data[0:result])
  197.                 self.input_data = self.input_data[result+6:]
  198.             else:
  199.                 result = string.find(self.input_data,"(y or n)")
  200.                 if (result != -1):
  201.                     self.process_command(self.input_data)
  202.                     self.input_data = ""
  203.             
  204.  
  205.         self.master.after(5, self.poll)        
  206.                 
  207.             
  208. ######################################################################
  209.         
  210.     def do_registers(self, lines):
  211.         old_lines = string.split(self.registers.get("1.0",END), "\n")
  212.         self.registers.delete("1.0",END)
  213.         j = 0;
  214.         if lines[1][1:3] == "r0":
  215.             for i in [33,35,36,37]+range(0,33) :
  216.                 if reg_names[i] == "":
  217.                     self.registers.insert(END,"\n")
  218.                 else:
  219.                     result = App.match_reg.search(lines[i])
  220.                     temp = result.group(1)
  221.                     reg = "0"*(8-len(temp))+temp
  222.                     if reg_names[i] == "PC  ":
  223.                         self.pc = reg
  224.                     
  225.                     reg = reg_names[i]+reg
  226. #                    if old_lines[j] != reg:
  227. #                        pass
  228.                     
  229.                     self.registers.insert(END,reg+"\n")
  230.                 j = j + 1
  231.         else:
  232.             self.pc = ""
  233.             self.registers.insert(END,"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
  234.  
  235.  
  236.  
  237. ######################################################################
  238.         
  239.     def update_list(self, lines):
  240.         self.dis.delete("1.0",END)
  241.  
  242.         if self.pc != "":
  243.             for i in [1,7,8,9,10]:
  244.                 if (len(lines)>i):
  245.                     self.dis.insert(END,self.cleanup_line(lines[i]))
  246.             self.dis.see(END)
  247.  
  248. ######################################################################
  249.         
  250.     def update_asm_list(self, lines):
  251.         self.dis.delete("1.0",END)
  252.  
  253.         if self.pc != "":
  254.             for i in [1,2,3,4,5]:
  255.                 if (len(lines)>i):
  256.                     self.dis.insert(END,self.cleanup_line(lines[i]))
  257.             self.dis.see(END)
  258.  
  259. ######################################################################
  260.         
  261.     def do_floats(self, lines):
  262.         pass
  263.     
  264.  
  265. ######################################################################
  266.         
  267.     def cleanup_line(self, line):
  268.         while 1:
  269.             result = App.match.search(line)
  270.             if result == None:
  271.                 break
  272.             
  273.             r = " "*string.atoi(result.group(1))
  274.  
  275.             line = App.match.sub(r,line)
  276.         return line
  277.     
  278.  
  279. ######################################################################
  280.         
  281.     def write_line(self, line):
  282.         if (line == "(gdb) "):
  283.             pass
  284.         else:
  285.             line = self.cleanup_line(line)
  286.             self.history.insert(END,line)
  287.         
  288.             
  289. ######################################################################
  290.  
  291.     def process_command(self, block):
  292.         lines = string.split(block, "\r")
  293.         
  294.         if lines[0][0:1] == "\n":
  295.             lines[0] = lines[0][1:END]
  296.             
  297.         if lines[0] == "i reg":
  298.             self.do_registers(lines)
  299.         elif lines[0][0:7] == "#update":
  300.             self.issue_update()
  301.         elif lines[0][0:4] == "#asm":
  302.             self.LIST_CMD = "disas $pc $pc+20\n"
  303.         elif lines[0][0:4] == "#src":
  304.             self.LIST_CMD = "list *$pc\n"
  305.         elif (lines[0] == "stepi")or(lines[0] == "nexti"):
  306.             self.LIST_CMD = "disas $pc $pc+20\n"
  307.             self.history.insert(END,self.dis.get("3.0","3.end")+"\n")
  308.         elif (lines[0] == "step")or(lines[0] == "next"):
  309.             self.LIST_CMD = "list *$pc\n"
  310.             self.history.insert(END,self.dis.get("3.0","3.end")+"\n")
  311.         elif lines[0][0:9] == "list *$pc":
  312.             self.update_list(lines)
  313.         elif lines[0][0:9] == "disas $pc":
  314.             self.update_asm_list(lines)
  315.         elif lines[0] == "i float":
  316.             self.do_floats
  317.         elif lines[0] == "set height 0":
  318.             pass
  319.         else:
  320.             # echo to screen
  321.             for i in lines:
  322.                 self.write_line(i)
  323.         self.history.see(END)
  324.  
  325.  
  326. ######################################################################
  327.  
  328.     def issue_update(self):
  329.         self.tn.write("i reg\n" + self.LIST_CMD)
  330.  
  331.     
  332. ######################################################################
  333.  
  334.     def issue_list(self):
  335.         if self.pc != "":
  336.             self.tn.write("list 0x"+self.pc+"\n")
  337.         else:
  338.             self.dis.erase("0.1",END)
  339.     
  340. ######################################################################
  341.  
  342.     def strip_our_commands(self, line):
  343.         if line == "next":
  344.             self.tn.write("next\n" +
  345.                           "i reg\n" +
  346.                           "list *$pc\n")
  347.         elif line == "nexti":
  348.             self.tn.write("nexti\n" +
  349.                           "i reg\n" +
  350.                           "disas $pc $pc+20\n")
  351.         elif line == "t":
  352.             if self.LIST_CMD[0:4] == "list":
  353.                 self.tn.write("next\n" +
  354.                               "i reg\n" +
  355.                               self.LIST_CMD)
  356.             else:
  357.                 self.tn.write("nexti\n" +
  358.                               "i reg\n" +
  359.                               self.LIST_CMD)
  360.         elif line == "step":
  361.             self.tn.write("step\n" +
  362.                           "i reg\n" +
  363.                           "list *$pc\n")
  364.         elif line == "stepi":
  365.             self.tn.write("stepi\n" +
  366.                           "i reg\n" +
  367.                           "disas $pc $pc+20\n")
  368.         elif line == "s":
  369.             if self.LIST_CMD[0:4] == "list":
  370.                 self.tn.write("step\n" +
  371.                               "i reg\n" +
  372.                               self.LIST_CMD)
  373.             else:
  374.                 self.tn.write("stepi\n" +
  375.                               "i reg\n" +
  376.                               self.LIST_CMD)
  377.                 
  378.         elif line == "il":    # list from PC
  379.             self.tn.write("disassemble $pc $pc+0x20\n")
  380.         elif line == "ip":    # list around PC
  381.             self.tn.write("disassemble $pc-0x10 $pc+0x10\n")
  382.         elif line == "ils":    # list from PC
  383.             self.tn.write("list *$pc\n")
  384.         elif line == "ips":    # list around PC
  385.             self.tn.write("list *$pc\n")
  386.         elif line == "sc":
  387.             self.tn.write("backtrace\n" +
  388.                           "i reg\n" +
  389.                           self.LIST_CMD)
  390.         elif line == "run":
  391.             self.tn.write("run\n" +
  392.                           "i reg\n" +
  393.                           self.LIST_CMD)
  394.         elif line == "kill":
  395.             self.tn.write("kill\n" +
  396.                           "i reg\n" +
  397.                           self.LIST_CMD)
  398.         elif line == "asm":
  399.             self.tn.write("#asm\n")
  400.             self.tn.write("disas $pc $pc+20\n")
  401.         elif line == "src":
  402.             self.tn.write("#src\n")
  403.             self.tn.write("list *$pc\n")
  404.         else:
  405.             self.tn.write(line+"\n")
  406.  
  407. ######################################################################
  408.  
  409.     def issue_command(self, event):
  410.         my_text = self.commands.get()
  411.         if (my_text[0:9] == "connect_X"):
  412.             if (self.connected):
  413.                 self.history.insert(END,"\nAlready Connected!")
  414.             else:
  415.                 self.connect_X()
  416.         elif (my_text[0:7] == "connect"):
  417.             if (self.connected):
  418.                 self.history.insert(END,"\nAlready Connected!")
  419.             else:
  420.                 self.connect()
  421.         else:
  422.             if self.connected:
  423.                 self.strip_our_commands(my_text)
  424.             else:
  425.                 self.history.insert(END,"\nNot Connected!")    
  426.         self.commands.delete(0,END)
  427.  
  428. root = Tk()
  429. app = App(root)
  430. root.title("Foo")
  431. root.mainloop()
  432.  
  433.